package control

import (
	"database/sql"
	"fmt"
	"gORM/db"
	"gORM/models"
)


func Insert()  {
	//Db, _ := db.InitDB()
	defer db.Db.Close()
	user:= models.User{Name: "小强", Age: sql.NullInt32{20, true}}
	//age:=12
	//user:= models.User{Name: "小强", Age: &age}
	record := db.Db.NewRecord(user)
	fmt.Println(record)
	db.Db.Create(&user)
	//db.Db.Create(&models.User{Name: "小花", Age: sql.NullInt32{0, true}})
}

func Search() {
	defer db.Db.Close()
	var user models.User
	//First仅当id为int类整型才可用，根据id排序返回第一个
	db.Db.First(&user)  //SELECT * FROM users ORDER BY id LIMIT 1;

	//Take随机返回一个值,但基本上返回第一个
	//db.Db.Take(&user)   //SELECT * FROM users LIMIT 1;

	// 根据主键查询最后一条记录
	//db.Db.Last(&user)  // SELECT * FROM users ORDER BY id DESC LIMIT 1;

	// 查询指定的某条记录(仅当主键为整型时可用)
	//db.Db.First(&user, 2) // SELECT * FROM users WHERE id = 2

	// 查询所有的记录
	var users []models.User
	//db.Db.Find(&users)  // SELECT * FROM users;

	//where查询
	//获取匹配的第一条数据
	//db.Db.Where("name=?","小强").First(&user)
	//匹配所有
	//db.Db.Where("name=?","小强").Find(&users)
	//同下
	//db.Db.Find(&users,"name=?","小强")

	// BETWEEN,左右闭合
	//db.Db.Where("age BETWEEN ? AND ?", 18, 20 ).Find(&users)

	//多条件查询.
	//结构体形式。主键为整型时同 First(&user, 2)
	//如果结构体中可为空字段不是使用指针或sql.NullXXX时，通过结构体进行查询时，GORM将会只通过非零值字段查询，
	//这意味着如果你的字段值为0，''， false 或者其他 零值时，将不会被用于构建查询条件
	//db.Db.Where(&models.User{Name: "小花", Age: sql.NullInt32{19,true}}).First(&user)

	// Map
	//db.Db.Where(map[string]interface{}{"name": "小强", "age": 12}).Find(&users)
	// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

	// 主键切片
	//db.Db.Where([]int32{2, 3, 5}).Find(&users)  // SELECT * FROM users WHERE id IN (2, 3, 5);

	//Not,不等于或者不在
	//db.Db.Not([]int32{2, 3, 5}).Find(&users)  // SELECT * FROM users WHERE id NOT IN (2, 3, 5);

	//Or
	//db.Db.Where("name=?","小强").Or("name=?","小花").Find(&users)
	//同下
	//db.Db.Find(&users,"name=? or name=?","小强","小花")

	//FirstOrInit.获取匹配的第一条记录，否则根据给定的条件初始化一个新的对象 (仅支持 struct 和 map 条件)
	//不会写入数据库
	//db.Db.FirstOrInit(&user, &models.User{Name: "go", Age: sql.NullInt32{11,true}})

	//Attrs,根据where条件查找。如果记录未找到，将使用参数初始化 struct.
	//db.Db.Where(models.User{Name: "小花"}).Attrs(models.User{Age: sql.NullInt32{11,true}}).FirstOrInit(&user)
	//db.Db.Where(models.User{Name: "小花"}).Attrs("age", 11).FirstOrInit(&user)

	//Assign,不管记录是否找到，都将参数赋值给 struct.但Assign参数可能不是数据库查询到的结果
	//db.Db.Where(models.User{Name: "小花"}).Assign("age", 11).FirstOrInit(&user)

	//FirstOrCreate，获取匹配的第一条记录, 否则根据给定的条件创建一个新的记录 (仅支持 struct 和 map 条件)
	//写入到数据库
	//db.Db.FirstOrCreate(&user,models.User{Name:"go",Age: sql.NullInt32{11,true}})

	//子查询SubQuery
	//db.Db.Where("age>?",db.Db.Table("users").Select("avg(age)").SubQuery()).Find(&users)

	var p models.Profile
	db.Db.First(&p)
	fmt.Println(p)
	db.Db.Model(&p).Related(&p.User)
	//db.Db.Model(&user).Related(&user.)


	fmt.Println(p)
	fmt.Println(user)
	fmt.Println(users)

}

//func main() {
//	err := db.InitDB()
//	if err!=nil{
//		fmt.Println("InitDB error:",err)
//	}
//	Insert()
//}


